/**
 * 
 */
package t4j.concurrency;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.ThreadFactory;


class ExceptionThread2 implements Runnable {

	public void run() {
		Thread t = Thread.currentThread();
		System.out.println("run() by " + t);
		System.out.println("eh = " + t.getUncaughtExceptionHandler());
		
		throw new RuntimeException();
	}
}
//异常处理器
class MyUncaughtExceptionHandler implements Thread.UncaughtExceptionHandler{
	
	@Override
	public void uncaughtException(Thread t, Throwable e) {
		System.out.println("caught " + e);
	}
}

//线程工厂：用它来创建线程
class HandlerThreadFactory implements ThreadFactory{

	@Override
	public Thread newThread(Runnable r) {
		
		System.out.println(this + " creating new Thread");
		
		Thread t = new Thread(r);
		
		System.out.println("created " + t);
		
		t.setUncaughtExceptionHandler(new MyUncaughtExceptionHandler());//设置Exception处理器
		
		System.out.println("eh = " + t.getUncaughtExceptionHandler());
		
		return t;
	}
}

public class CaptureUncaughException {
	public static void main(String[] args) {
		ExecutorService exec = Executors.newCachedThreadPool(new HandlerThreadFactory());
		
		exec.execute(new ExceptionThread2());
	}
	
}
